/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mindbox.mueblesalpes.presentacion.compras;

import com.mindbox.mueblesalpes.negocio.compras.ComprasMock;
import com.mindbox.mueblesalpes.negocio.compras.ICompras;
import com.mindbox.mueblesalpes.negocio.entity.CategoriaValor;
import com.mindbox.mueblesalpes.negocio.entity.Cliente;
import com.mindbox.mueblesalpes.negocio.entity.Compra;
import com.mindbox.mueblesalpes.negocio.entity.Mueble;
import com.mindbox.mueblesalpes.negocio.entity.Usuario;
import com.mindbox.mueblesalpes.presentacion.sesion.SessionInfo;
import com.mindbox.mueblesalpes.presentacion.utils.Mensajes;
import com.mindbox.mueblesalpes.presentacion.utils.ReglasNavegacion;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

/**
 *
 * @author jsanchez
 */
public class AgregarCarritoBackingBean {

    private List<Compra> carritoCompras;
    private Usuario usuario;
    private Cliente cliente;
    private boolean validoUsuario = true;
    private ICompras compras;
    private double subtotal;
    private List<CategoriaValor> catergoriasValor;
    private double valorTotal;
    private boolean puedeEfectuarCompra;

    /** Creates a new instance of AgregarCarritoBackingBean */
    public AgregarCarritoBackingBean() {
        this.compras = new ComprasMock();
        SessionInfo sesion = verificarSesion();
        if (sesion != null && this.validoUsuario) {
            this.usuario = sesion.getUsuario();
            this.cliente = sesion.getCliente();
            this.carritoCompras = sesion.getCarritoCompras();

            // Se verifica si se debe agregar un producto al carrito
            Mueble muebleSeleccionado = sesion.getMuebleSeleccionado();
            if (muebleSeleccionado != null) {
                int index = this.carritoCompras.indexOf(new Compra(muebleSeleccionado, 0, 0.0));
                if (index < 0) {
                    //Se debe agregar al carrito.
                    this.carritoCompras.add(new Compra(muebleSeleccionado, 1,
                            this.compras.obtenerPrecioInventarioMueble(muebleSeleccionado).getPrecio()));
                } else {
                    // Se debe actualizar la catnidad de la compra
                    Compra compra = this.carritoCompras.get(index);
                    compra.setCantidad(compra.getCantidad() + 1);
                }
                // Se coloca el mueble seleccionado en null para no volverlo a adicionar
                sesion.setMuebleSeleccionado(null);
            }
            this.setSubtotal(this.compras.calcularSubtotalCompra(carritoCompras));
            this.setCatergoriasValor(this.compras.calcularValorCategoriasCompra(carritoCompras));
            this.setValorTotal(this.compras.calcularValorTotalCompra(catergoriasValor));
            if(this.validoUsuario && this.carritoCompras.size() > 0)
                puedeEfectuarCompra = true;
            else
                puedeEfectuarCompra = false;
        }
    }

    private SessionInfo verificarSesion() {
        FacesContext context = FacesContext.getCurrentInstance();
        HttpSession httpSession = (HttpSession) context.getExternalContext().getSession(false);
        SessionInfo sesion = (SessionInfo) httpSession.getAttribute(SessionInfo.class.getName());
        this.validoUsuario = true;
        if (sesion == null) {
            //ERRROR
            //TODO Traer msg del properties
            Mensajes.asignarMensajeError("No tiene sesión asignada");
            this.validoUsuario = false;
        } else {
            //Validar usuario y cliente
            if (sesion.getUsuario() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha autenticado el usuario");
                this.validoUsuario = false;
            }
            if (sesion.getCliente() == null) {
                //TODO Traer msg del properties
                Mensajes.asignarMensajeError("No se ha registrado como cliente");
                this.validoUsuario = false;
            }
        }
        return sesion;
    }

    /**
     * Metodo que se ejecuta cuando se da clic en el boton continuar compra.
     * @return
     */
    public String continuarCompra() {
        return ReglasNavegacion.continuar_compra.name();
    }

    /**
     * Metodo que se ejecuta cuando se da clic en efectuar Compra.
     * @return
     */
    public String efectuarCompra() {
        SessionInfo sesion = verificarSesion();
        String regla = "";
        if (sesion != null) {
            sesion.setVenta(this.compras.realizarVenta(catergoriasValor,
                    cliente, usuario, carritoCompras, valorTotal));
            regla = ReglasNavegacion.pagar.name();
        }
        return regla;
    }

    public List<Compra> getCarritoCompras() {
        return carritoCompras;
    }

    public void setCarritoCompras(List<Compra> carritoCompras) {
        this.carritoCompras = carritoCompras;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public boolean isValidoUsuario() {
        return validoUsuario;
    }

    public void setValidoUsuario(boolean validoUsuario) {
        this.validoUsuario = validoUsuario;
    }

    public double getSubtotal() {
        return subtotal;
    }

    public void setSubtotal(double subtotal) {
        this.subtotal = subtotal;
    }

    public List<CategoriaValor> getCatergoriasValor() {
        return catergoriasValor;
    }

    public void setCatergoriasValor(List<CategoriaValor> catergoriasValor) {
        this.catergoriasValor = catergoriasValor;
    }

    public double getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(double valorTotal) {
        this.valorTotal = valorTotal;
    }

    public boolean isPuedeEfectuarCompra() {
        return puedeEfectuarCompra;
    }

    public boolean getPuedeEfectuarCompra() {
        return puedeEfectuarCompra;
    }
    public void setPuedeEfectuarCompra(boolean puedeEfectuarCompra) {
        this.puedeEfectuarCompra = puedeEfectuarCompra;
    }
}